/**
 * 2018年12月1日下午9:30:48
 * @author 谢进财
 */
package com.baihang.framework.kit;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.CellType;

import com.baihang.framework.dao.Record;

/**
 * Excel 工具类
 *
 */
public class ExcelKit {
	/**
	 * 根据数据集导出excel
	 * 最普通的通用方式，只有一行标头，下面就是数据。
	 * @param records
	 * @return
	 */
	public static HSSFWorkbook  writeToExcel(List<Record> records) {
		HSSFWorkbook workbook = new HSSFWorkbook();  // 创建工作簿对象  
	    HSSFSheet sheet = workbook.createSheet("sheet1"); //创建一个列表
	    //创建标题行
	    HSSFRow rowm = sheet.createRow(0);
	    Record title = records.get(0);
	    Map<String,Object> map = title.getColumns();
	    int i=0;
		for (String key : map.keySet()) {
			rowm.createCell(i).setCellValue(key);
			i++;
		}
		//创建数据行
		Record data=null;
		Map<String,Object> mapData=null;
		for(int k=0;k<records.size();k++) {
			 data = records.get(k);
			 mapData =data.getColumns();
			 HSSFRow row = sheet.createRow(k+1); 
			 int j=0;//每行的索引
			 for (Entry<String, Object> entry : mapData.entrySet()) {
				 HSSFCell cell = row.createCell(j);
				 if(entry.getValue() instanceof String) {
					 cell.setCellType(CellType.STRING);//字符型
					 cell.setCellValue((String) entry.getValue());
				 }else {
					 cell.setCellType(CellType.NUMERIC);
					 if(entry.getValue() instanceof Double ) {
						 cell.setCellValue((Double) entry.getValue());						 
					 }else if(entry.getValue() instanceof Integer) {
						 cell.setCellValue((Integer) entry.getValue());	
					 }else if(entry.getValue() instanceof Float){
						 cell.setCellValue((Float) entry.getValue());	
					 }
				 }
				 j++;
			 }
		}
		return workbook;
	}
	/**
	 * 根据模板和数据集返回excel表示。
	 * 只针对普通类型模板 标头与数据集字段一一对应
	 * @param records
	 * @param file
	 * @return
	 * @throws Exception
	 */
	public static HSSFWorkbook  writeToExcel2(List<Record> records,File file) throws Exception {
		FileInputStream fs=new FileInputStream(file); //读取文件  
        POIFSFileSystem ps=new POIFSFileSystem(fs);//使用POI提供的方法得到excel的信息
        HSSFWorkbook wb=new HSSFWorkbook(ps);  
        //HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs);	//直接这样使用也可以	
        HSSFSheet sheet=wb.getSheetAt(1);  //获取到工作表，因为一个excel可能有多个工作表  
        //HSSFRow row=sheet.getRow(0);  //获取第一行（excel中的行默认从0开始，所以这就是为什么，一个excel必须有字段列头），即，字段列头，便于赋值  
        //System.out.println(sheet.getLastRowNum()+" "+row.getLastCellNum());  //分别得到最后一行的行号，和一条记录的最后一个单元格  
      //创建数据行
            /***因为只有第一行有数据，下面的行没有数据，所以下面的行都需要 createRow****/
      		Record data=null;
      		Map<String,Object> mapData=null;
      		for(int k=0;k<records.size();k++) {
      			 data = records.get(k);
      			 mapData =data.getColumns();
      			 HSSFRow row = sheet.createRow(k+1); 
      			 int j=0;//每行的索引
      			 for (Entry<String, Object> entry : mapData.entrySet()) {
      				 HSSFCell cell = row.createCell(j);
      				 if(entry.getValue() instanceof String) {
      					 cell.setCellType(CellType.STRING);//字符型
      					 cell.setCellValue((String) entry.getValue());
      				 }else {
      					 cell.setCellType(CellType.NUMERIC);
      					 if(entry.getValue() instanceof Double ) {
      						 cell.setCellValue((Double) entry.getValue());						 
      					 }else if(entry.getValue() instanceof Integer) {
      						 cell.setCellValue((Integer) entry.getValue());	
      					 }else if(entry.getValue() instanceof Float){
      						 cell.setCellValue((Float) entry.getValue());	
      					 }
      				 }
      				 j++;
      			 }
      		}
      		/**
      		 * 注意 ：如果要修改单元格的数据
 	         HSSFRow row = hssfsheet.getRow(1); //找行
			 row.getCell(1).setCellValue("财哥");//找准列，设置数据
			 前提是这个位置一定要有数据，否则会报空指针错误
      		 */
		return wb;
	}
	
	/**
	 * 针对通用格式的Excel文件
	 * @param file excel文件
	 * @param keyMap 保存字段顺序
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("resource")
	public static List<Record> readFromExcel(File file,Map<Integer,String> keyMap) throws Exception{
		FileInputStream fs=new FileInputStream(file); //读取文件;
		POIFSFileSystem ps=new POIFSFileSystem(fs);
		HSSFWorkbook hw = new HSSFWorkbook(ps);
		HSSFSheet hs = hw.getSheetAt(0);
		
		List<Record> recordList = new ArrayList<Record>();
		HSSFRow row = null;
		for (int i = 1; i <= hs.getLastRowNum(); i++) {//默认0行为标头，所以从第一行开始读
			row = hs.getRow(i);
			Record  record = new Record();
			HSSFCell cell =null;
			for(Entry<Integer,String> entry : keyMap.entrySet()) {
				cell = row.getCell(entry.getKey());
				if(cell!=null && cell.getCellType()!=CellType.BLANK && cell.getCellType()!=CellType._NONE) {
					if(cell.getCellType() == CellType.STRING){
						record.getColumns().put(entry.getValue(), cell.getStringCellValue());					
					}else if(cell.getCellType()==CellType.NUMERIC) {
						record.getColumns().put(entry.getValue(), cell.getNumericCellValue());	
					}
				}else {
					record.getColumns().put(entry.getValue(), "");//赋个空值,保持字段完整
					//continue;
				}
			}
			recordList.add(record);
		}
		return recordList;
	}
	public static void main(String[] args) throws Exception {
		/*
		FileInputStream fs=new FileInputStream("E:\\Test\\2号楼.xls"); //读取文件  
        POIFSFileSystem ps=new POIFSFileSystem(fs);//使用POI提供的方法得到excel的信息
        @SuppressWarnings("resource")
		HSSFWorkbook wb=new HSSFWorkbook(ps);  
        HSSFSheet sheet=wb.getSheetAt(1);  //获取到工作表，因为一个excel可能有多个工作表  
        HSSFRow row=sheet.getRow(0);  //获取第一行（excel中的行默认从0开始，所以这就是为什么，一个excel必须有字段列头），即，字段列头，便于赋值  
        System.out.println(sheet.getLastRowNum()+" "+row.getLastCellNum());  //分别得到最后一行的行号，和一条记录的最后一个单元格  
		*/
		 File file = new File("E:\\Test\\2号楼.xls");
		 Map<Integer,String> keyMap = new HashMap<Integer,String>();			
		 keyMap.put(0, "D_ID");
		 keyMap.put(1, "D_RoomNo");
		 keyMap.put(2, "D_Unit");
		 keyMap.put(3, "D_FloorArea");
		 keyMap.put(4, "D_InnerArea");
		 keyMap.put(5, "D_AssessmentArea");
		 keyMap.put(6, "D_Price");
		 keyMap.put(7, "D_Total");
		 keyMap.put(8, "D_discountPrice");
		 keyMap.put(9, "D_discountTotal");
		 keyMap.put(10, "D_column");
		 keyMap.put(11, "d_position");
		 keyMap.put(12, "D_HouseModel");
		 keyMap.put(13, "D_RoomType");
		 List<Record> recList =ExcelKit.readFromExcel(file,keyMap);
		 String json = JsonKit.listToJson(recList, 1);
		 System.err.println(json);
	}
}
